package tp.model;

import java.util.Observable;
import java.awt.Component;
import tp.controller.Controlador;

/*Clase madre de los ladrillos que participen en el juego*/
/**
 * @author Dr Von Nostrum 05/10/2006 version 1.1, he cambiado por protected unos
 *         metodos
 */
public abstract class Ladrillo extends Observable implements Chocable {

	protected double MiAncho = 40;

	protected double MiAlto = 15;

	/* cantidad de golpes a ser destruido */
	private int Vida;

	public boolean vivo = true;

	/* puntos que otorgan al ser destruidos */
	private int Puntaje;

	/* Posicion */
	private Posicion MiPosicion;

	private double MiRadio = 1;

	public Component miVista;

	/*
	 * Calcula la posicion exacta de donde lo chocaron, tomando como datos la
	 * posicion deonde estaba el objeto chocador y la direccion que tenia @param
	 * Chocable Recibe el elemento que produce el choque @return Posicion Que es
	 * la posicion en donde el choque fue producido (sobre alguno de los cuatro
	 * lados del bloque)
	 */
	public Posicion dondeMeToca(Chocable elem) {
		/*
		 * Posicion posicionDeLado = new Posicion(this.MiAncho/2,this.MiAlto/2);
		 * posicionDeLado =
		 * posicionDeLado.multiplicarPosicion(this.miNormal(elem));
		 * posicionDeLado = this.getMiPosicion().sumarPosicion(posicionDeLado);
		 * Posicion Inter1 =
		 * elem.getMiPosicionVieja().moverEnXEnDireccion(posicionDeLado,
		 * elem.getMiDireccion()); Posicion Inter2 =
		 * elem.getMiPosicionVieja().moverEnYEnDireccion(posicionDeLado,
		 * elem.getMiDireccion()); if
		 * ((Inter2.getY()==(this.getMiPosicion().getY()-this.MiAlto/2))||((Inter2.getY()==(this.getMiPosicion().getY()+this.MiAlto/2)))){
		 * return Inter2; } if
		 * ((Inter1.getX()==(this.getMiPosicion().getX()-this.MiAncho/2))||((Inter1.getX()==(this.getMiPosicion().getX()+this.MiAncho/2)))){
		 * return Inter1; } return null;
		 */
		return elem.getMiPosicionVieja();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tp.Chocable#miNormal()
	 */
	public Posicion miNormal(Chocable elem) {
		Posicion ladoInf = new Posicion(this.getMiPosicion().getX(), this
				.getMiPosicion().getY()
				- (this.getMiAlto() / 2));
		ladoInf = elem.getMiPosicionVieja().sumarPosicionY(elem.getMiRadio())
				.moverEnYEnDireccion(ladoInf, elem.getMiDireccion());// Va a
		// obtener
		// la
		// posicion
		// de
		// interseccion
		Posicion ladoSup = new Posicion(this.getMiPosicion().getX(), this
				.getMiPosicion().getY()
				+ (this.getMiAlto() / 2));
		ladoSup = elem.getMiPosicionVieja().sumarPosicionY(-elem.getMiRadio())
				.moverEnYEnDireccion(ladoSup, elem.getMiDireccion());// Va a
		// obtener
		// la
		// posicion
		// de
		// interseccion
		Posicion ladoIzq = new Posicion((this.getMiPosicion().getX() - (this
				.getMiAncho() / 2)), this.getMiPosicion().getY());
		ladoIzq = elem.getMiPosicionVieja().sumarPosicionX(elem.getMiRadio())
				.moverEnXEnDireccion(ladoIzq, elem.getMiDireccion());// Va a
		// obtener
		// la
		// posicion
		// de
		// interseccion
		Posicion ladoDer = new Posicion((this.getMiPosicion().getX() + (this
				.getMiAncho() / 2)), this.getMiPosicion().getY());
		ladoDer = elem.getMiPosicionVieja().sumarPosicionX(-elem.getMiRadio())
				.moverEnXEnDireccion(ladoDer, elem.getMiDireccion());// Va a
		// obtener
		// la
		// posicion
		// de
		// interseccion
		if (((ladoInf.getX() <= (this.getMiPosicion().getX() + this
				.getMiAncho() / 2)))
				&& (((ladoInf.getX() >= (this.getMiPosicion().getX() - this
						.getMiAncho() / 2))))
				&& (elem.getMiDireccion().getY() >= 0)) {
			return new Posicion(0, -1);
		}
		if (((ladoSup.getX() <= (this.getMiPosicion().getX() + this
				.getMiAncho() / 2)))
				&& (((ladoSup.getX() >= (this.getMiPosicion().getX() - this
						.getMiAncho() / 2))))
				&& (elem.getMiDireccion().getY() <= 0)) {
			return new Posicion(0, 1);
		}
		if (((ladoIzq.getY() <= (this.getMiPosicion().getY() + this.getMiAlto() / 2)))
				&& (((ladoInf.getY() >= (this.getMiPosicion().getY() - this
						.getMiAlto() / 2))))
				&& (elem.getMiDireccion().getX() >= 0)) {
			return new Posicion(-1, 0);
		}
		if (((ladoDer.getY() <= (this.getMiPosicion().getY() + this.getMiAlto() / 2)))
				&& (((ladoInf.getY() >= (this.getMiPosicion().getY() - this
						.getMiAlto() / 2))))
				&& (elem.getMiDireccion().getX() <= 0)) {
			return new Posicion(1, 0);
		}
		return new Posicion(1, 0);
	}

	/*
	 * Constructor: Recibe la cantidad de vida y puntaje que otorga con la
	 * posicion recibida
	 */
	/*
	 * public Ladrillo(int VidaSet, int PuntajeSet, Posicion Pos){
	 * this.setVida(VidaSet); this.setPuntaje(PuntajeSet); this.MiPosicion=Pos; };
	 */

	public int getVida() {
		return this.Vida;
	};

	public void setVida(int vidaSet) {
		this.Vida = vidaSet;
	};

	public int getPuntaje() {
		return this.Puntaje;
	};

	public void setPuntaje(int puntajeSet) {
		this.Puntaje = puntajeSet;
	};

	/*
	 * Responde al choque, se quita una posibilidad de vida y se fija si fue
	 * destruido
	 */
	public void meChocaron(Chocable elem) {
		this.setVida((this.getVida() - 1));
		if (this.getVida() == 0) {
			this.meDestruyo();
		}
	};

	/**
	 * Devuelve los puntos que otorga por ser destruido y/o el especial de cada
	 * ladrillo en caso de que tenga la llamada debera estar aqui
	 */
	public void meDestruyo() {
		// mostraria que hace explosion o algo similar
		// tendria que avisarle al controlador que se fue al joraca
		Controlador.setPuntaje(this.getPuntaje());
		this.setMiPosicion(null);
		this.setVivo(false);
		// llamaria a especial de necesitarlo
	}

	/**
	 * @return miPosicion. en una vble Posicion
	 */
	public Posicion getMiPosicion() {
		return this.MiPosicion;
	}

	/**
	 * @param miPosicion
	 *            que es para setear miPosicion
	 */
	public void setMiPosicion(Posicion miPosicion) {
		this.MiPosicion = miPosicion;
	};

	/**
	 * no tiene direccion el ladrillo
	 * 
	 * @return null
	 */
	public Posicion getMiDireccion() {
		return null;
	}

	/**
	 * Por ahora no hace nada los ladrillos no se mueven
	 * 
	 * @return devuelve la posicion cualquiera
	 */
	public Posicion getMiPosicionVieja() {
		return this.getMiPosicion();
	};

	/**
	 * 
	 */

	public boolean meToca(Posicion pos) {
		if ((pos.getX() > (this.MiPosicion.getX() - this.MiAncho / 2) && (pos
				.getX() < (this.MiPosicion.getX()) + this.MiAncho / 2))) {
			if ((pos.getY() > (this.MiPosicion.getY() - this.MiAlto / 2) && (pos
					.getY() < (this.MiPosicion.getY()) + this.MiAlto / 2))) {
				return true;
			}
		}
		return false;
	}

	public boolean meToca(Chocable elem) {
		if (isVivo() == true) {
			Posicion posChocador = elem.getMiPosicion();
			if (((posChocador.getY() + elem.getMiRadio()) <= ((this.getMiPosicion().getY()) + (this.getMiAlto() / 2)))
			&& ((posChocador.getY() + elem.getMiRadio()) >= ((this.getMiPosicion().getY()) - (this.getMiAlto() / 2)))) {
				if ((posChocador.getX() <= ((this.getMiPosicion().getX()) + (this.getMiAncho() / 2)))
				&& (posChocador.getX() >= ((this.getMiPosicion().getX()) - (this.getMiAncho() / 2)))) {
					return true;
				}
			}
			if (((posChocador.getY() - elem.getMiRadio()) <= ((this.getMiPosicion().getY()) + (this.getMiAlto() / 2)))
			&& ((posChocador.getY() - elem.getMiRadio()) >= ((this.getMiPosicion().getY()) - (this.getMiAlto() / 2)))) {
				if ((posChocador.getX() <= ((this.getMiPosicion().getX()) + (this.getMiAncho() / 2)))
				&& (posChocador.getX() >= ((this.getMiPosicion().getX()) - (this.getMiAncho() / 2)))) {
					return true;
				}
			}
			if ((posChocador.getY() <= ((this.getMiPosicion().getY()) + (this.getMiAlto() / 2)))
			&& (posChocador.getY() >= ((this.getMiPosicion().getY()) - (this.getMiAlto() / 2)))) {
				if (((posChocador.getX() + elem.getMiRadio()) <= ((this.getMiPosicion().getX()) + (this.getMiAncho() / 2)))
				&& ((posChocador.getX() + elem.getMiRadio()) >= ((this.getMiPosicion().getX()) - (this.getMiAncho() / 2)))) {
					return true;
				}
			}
			if ((posChocador.getY() <= ((this.getMiPosicion().getY()) + (this.getMiAlto() / 2)))
			&& (posChocador.getY() >= ((this.getMiPosicion().getY()) - (this.getMiAlto() / 2)))) {
				if (((posChocador.getX() - elem.getMiRadio()) <= ((this.getMiPosicion().getX()) + (this.getMiAncho() / 2)))
				&& ((posChocador.getX() - elem.getMiRadio()) >= ((this.getMiPosicion().getX()) - (this.getMiAncho() / 2)))) {
					return true;
				}
			} 
			else {
					if ((posChocador.distanciaA(this.getMiPosicion().sumarPosicionX(this.getMiAncho() / 2).sumarPosicionY(this.getMiAlto() / 2))) <= elem.getMiRadio()) {
						return true;
					}
					else if ((posChocador.distanciaA(this.getMiPosicion().sumarPosicionX((-this.getMiAncho() / 2)).sumarPosicionY(this.getMiAlto() / 2))) <= elem.getMiRadio()) {
						return true;
					}
					else if ((posChocador.distanciaA(this.getMiPosicion().sumarPosicionX((-this.getMiAncho() / 2)).sumarPosicionY((-this.getMiAlto() / 2)))) <= elem.getMiRadio()) {
						return true;
					}
					else if ((posChocador.distanciaA(this.getMiPosicion().sumarPosicionX(this.getMiAncho() / 2).sumarPosicionY((-this.getMiAlto() / 2)))) <= elem.getMiRadio()) {
						return true;
					}
			}
		}
		return false;
	}

		
		/*((pos.getX() > (this.MiPosicion.getX() - this.MiAncho / 2) && (pos
				.getX() < (this.MiPosicion.getX()) + this.MiAncho / 2))) {
			if ((pos.getY() > (this.MiPosicion.getY() - this.MiAltura / 2) && (pos
					.getY() < (this.MiPosicion.getY()) + this.MiAltura / 2))) {
				return true;
			}
		}
		return false;*/

	/**
	 * @return the miAlto
	 */
	public double getMiAlto() {
		return MiAlto;
	}

	/**
	 * @param miAlto
	 *            the miAlto to set
	 */
	public void setMiAlto(double miAlto) {
		MiAlto = miAlto;
	}

	/**
	 * @return the miAncho
	 */
	public double getMiAncho() {
		return MiAncho;
	}

	/**
	 * @param miAncho
	 *            the miAncho to set
	 */
	public void setMiAncho(double miAncho) {
		MiAncho = miAncho;
	}

	public Posicion hago() {
		return this.MiPosicion;
	}

	public String getClase() {
		return "Ladrillo";
	}

	public boolean isVivo() {
		return vivo;
	}

	public void setVivo(boolean vivo) {
		this.vivo = vivo;
	}

	/**
	 * @return the miRadio
	 */
	public double getMiRadio() {
		return MiRadio;
	}

	/**
	 * @param miRadio
	 *            the miRadio to set
	 */
	public void setMiRadio(double miRadio) {
		MiRadio = miRadio;
	}

	public void setMiDireccion(double X, double Y) {
	}
}
